package com.chebawang.util;

import java.util.Random;
import java.util.logging.Logger;


/**
 * 类型:编号生成 全局编号生成
 */
public class SerialNumber {

    /**
     * logger
     */
    private static final Logger logger = Logger.getLogger(SerialNumber.class.getName());

    /**
     * 长度
     */
    private static final int LENGTH = 8;

    /**
     * 编号前缀
     */
    public enum Prefix {
//		/** 驿站管理员 0*/
//		YZ,
//		/** 拉包工 */
//		LB,
//		/** 打包工 */
//		DB
        /**
         * 订单
         */
        YQ
    }

    /**
     * 根据类别获取随机编号
     *
     * @param prefix 类别
     * @return
     */
    public static String getRandNumber(Prefix prefix) {
        String number = prefix.name() + generateNumber();
        logger.info(prefix.name() + "生成随机编号:" + number);
        return number;
    }


    /**
     * 　　* 这是典型的随机洗牌算法。
     * <p>
     * 　　* 流程是从备选数组中选择一个放入目标数组中，将选取的数组从备选数组移除（放至最后，并缩小选择区域）
     * <p>
     * 　　* 算法时间复杂度O（n）
     * <p>
     * 　　* @return 随机8为不重复数组
     * <p>
     *
     */

    private static String generateNumber() {

        String no = "";

        // 初始化备选数组

        int[] defaultNums = new int[10];

        for (int i = 0; i < defaultNums.length; i++) {

            defaultNums[i] = i;

        }

        Random random = new Random();

        int[] nums = new int[LENGTH];

        // 默认数组中可以选择的部分长度

        int canBeUsed = 10;

        // 填充目标数组

        for (int i = 0; i < nums.length; i++) {

            // 将随机选取的数字存入目标数组

            int index = random.nextInt(canBeUsed);

            nums[i] = defaultNums[index];

            // 将已用过的数字扔到备选数组最后，并减小可选区域

            swap(index, canBeUsed - 1, defaultNums);

            canBeUsed--;

        }

        if (nums.length > 0) {

            for (int i = 0; i < nums.length; i++) {

                no += nums[i];

            }

        }

        return no;

    }

    /**
     * 交换方法
     *
     * @param i    交换位置
     * @param j    互换的位置
     * @param nums 数组
     */

    private static void swap(int i, int j, int[] nums) {

        int temp = nums[i];

        nums[i] = nums[j];

        nums[j] = temp;

    }

    /**
     * 根据类别获取日期格式的编号
     *
     * @param prefix
     * @return 前缀+yyyyMMddHHmmss
     */
    public static String getDateNumber(Prefix prefix) {
        String dateTime = DatesUtils.getStringToday("yyyyMMddHHmmss");
        String number = prefix.name() + dateTime;
        logger.info(prefix.name() + "生成日期格式编号:" + number);
        return number;
    }

    /**
     * 获取8位数
     *
     * @return
     */

    @SuppressWarnings("unused")
    private static String generateNumber2() {

        String no = "";

        int num[] = new int[8];

        int c = 0;

        for (int i = 0; i < 8; i++) {

            num[i] = new Random().nextInt(10);

            c = num[i];

            for (int j = 0; j < i; j++) {

                if (num[j] == c) {

                    i--;

                    break;

                }

            }

        }

        if (num.length > 0) {

            for (int i = 0; i < num.length; i++) {

                no += num[i];

            }

        }

        return no;
    }

    public static void main(String[] args) {
        System.out.println(getRandNumber(Prefix.YQ));
    }

}
